package Leetcode第二期;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;

/**
 * @author : K k
 * @date : 8:55 2020/10/14
 * 给定仅有小写字母组成的字符串数组 A，返回列表中的每个字符串中都显示的全部字符（包括重复字符）组成的列表。例如，如果一个字符在每个字符串中出现 3 次，但不是 4 次，则需要在最终答案中包含该字符 3 次。
 *
 * 你可以按任意顺序返回答案。
 *
 *  
 *
 * 示例 1：
 *
 * 输入：["bella","label","roller"]
 * 输出：["e","l","l"]
 * 示例 2：
 *
 * 输入：["cool","lock","cook"]
 * 输出：["c","o"]
 */
public class 查找常用字符_1002 {
    //思路1：hashmap计数   思路2：每个字符串一个26长度的数组计数
    public List<String> commonChars(String[] A) {
        HashMap<Character,Integer> map=new HashMap<>();
        for(int i=0;i<A[0].length();i++){
            char c = A[0].charAt(i);
            map.put(c,map.getOrDefault(c,0)+1);
        }
        for(int i=1;i<A.length;i++){
            String s=A[i];
            HashMap<Character,Integer> map2=new HashMap<>();
            for (int j=0;j<s.length();j++){
                char c = s.charAt(j);
                if (map.containsKey(c)) {
                    map2.put(c, Math.min(map2.getOrDefault(c, 0) + 1, map.get(c)));
                }
            }
            map=map2;
        }
        Set<Character> set = map.keySet();
        List<String> list=new ArrayList<>();
        for ( Character c: set){
            Integer count = map.get(c);
            for (int i=0;i<count;i++){
                list.add(c+"");
            }
        }
        return list;
    }
}
